#pragma once
#include <odb/database.hxx>
#include <odb/mysql/database.hxx>

#include "chat_session_member-odb.hxx"
#include "logger.hpp"

namespace im
{
    class ChatSessionMemberTable{
    public:
        using ptr = std::shared_ptr<ChatSessionMemberTable>;
        ChatSessionMemberTable(const std::shared_ptr<odb::database>& db)
            :_db(db){}
        //单个会话成员的新增 --- ssid & uid
        bool append(ChatSessionMember& csm){
            try{
                odb::transaction t(_db->begin());
                _db->persist(csm);
                t.commit();
            }
            catch(const std::exception& e){
                LOG_CRITICAL("新增单会话成员失败 {}-{}:{}！", csm.session_id(), csm.user_id(), e.what());
                return false;
            }
            return true;
        }

        //多个会话成员的新增 --- List(ssid & uid)
        bool append(std::vector<ChatSessionMember>& csm_list){
            if (csm_list.empty()) {
                return true; // 空列表无需操作
            }
            try{
                odb::transaction t(_db->begin());
                for(auto& csm : csm_list){
                    _db->persist(csm);
                }
                t.commit();
            }
            catch(const std::exception& e){
                LOG_CRITICAL("新增单会话多个成员失败 {}-{} [{}]:{}！",
                    csm_list[0].session_id(),
                    csm_list.size(),
                    typeid(e).name(),
                    e.what());
                return false;
            }
            return true;
        }

        //删除指定会话中的指定成员 -- ssid & uid

        bool remove(ChatSessionMember& csm){
            try{
                odb::transaction t(_db->begin());
                typedef odb::query<ChatSessionMember> query;
                _db->erase_query<ChatSessionMember>(query::session_id == csm.session_id() && query::user_id == csm.user_id());
                t.commit();
            }
            catch(const std::exception& e){
                LOG_CRITICAL("删除单会话成员失败 {}-{}:{}！", csm.session_id(), csm.user_id(), e.what());
                return false;
            }
            return true;
        }
        //删除会话的所有成员信息
        bool remove(const std::string& ssid){
            try{
                odb::transaction t(_db->begin());
                typedef odb::query<ChatSessionMember> query;
                _db->erase_query<ChatSessionMember>(query::session_id == ssid);
                t.commit();
            }
            catch(const std::exception& e){
                LOG_CRITICAL("删除单会话所有成员失败:{}！ - 会话ID-{} -", ssid, e.what());
                return false;
            }
            return true;
        }

        // 通过会话ID获取所有成员ID
        std::vector<std::string> members(const std::string& ssid){
            std::vector<std::string> member;
            try{
                odb::transaction t(_db->begin());
                typedef odb::query<ChatSessionMember> query;
                typedef odb::result<ChatSessionMember> result;
                result res(_db->query<ChatSessionMember>(query::session_id == ssid));
                for(const auto& r : res){
                    member.push_back(r.user_id());
                }
                t.commit();
            }
            catch (const std::exception& e){
                LOG_CRITICAL("获取会话成员失败:{}！ - 会话ID-{} -", ssid, e.what());
            }
            return member;
        }

    private:
        std::shared_ptr<odb::database> _db;
    };

}